package com.xiaopeng.common.page;

import com.github.pagehelper.Page;
import com.github.pagehelper.page.PageMethod;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.Objects;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * 用于转换分页对象
 */
@Slf4j
public class PageUtil<T> {


    /**
     * 结果对象和数据库对象不一致，需要对象转换和填充
     *
     * @param queryMethod   查询方法
     * @param pageReq       查询配置对象 提取分页参数
     * @param <R>           DTO数据库查询结果对象
     */
    public static <R> PageVO<R> convertPages(BasePageRequest pageReq, Supplier<List<R>> queryMethod) {
        try {
            Integer pageNum = pageReq.getPageNum();
            pageNum = Objects.isNull(pageNum) ? 1 : pageNum;

            Integer pageSize = pageReq.getPageSize();
            pageSize = Objects.isNull(pageSize) ? 20 : pageSize;

            boolean isCount = Objects.nonNull(pageReq.getIsCount()) ? pageReq.getIsCount() : true;

            // 使用分页插件
            Page<R> pageRes = PageMethod.startPage(pageNum, pageSize, isCount);
            // 执行查询方法
            List<R> list = queryMethod.get();
            // 封装分页
            PageVO<R> pageResponse = new PageVO<>();
            pageResponse.setPageSize(pageRes.getPageSize());
            pageResponse.setTotalRows(pageRes.getTotal());
            pageResponse.setPageNum(pageRes.getPageNum());
            pageResponse.setTotalPages(pageRes.getPages());
            pageResponse.setRoot(list);
            return pageResponse;
        } catch (Exception e) {
            log.error("page query fail", e);
            throw new RuntimeException(e);
        }
    }


    /**
     * 结果对象和数据库对象不一致，需要对象转换和填充
     *
     * @param queryMethod   查询方法
     * @param pageReq       查询配置对象 提取分页参数
     * @param <T>           入参
     * @param <R>           DTO数据库查询结果对象
     */
    public static <T extends BasePageRequest, R> PageVO<R> convertPages(T pageReq, Function<T, List<R>> queryMethod) {
        try {
            Integer pageNum = pageReq.getPageNum();
            pageNum = Objects.isNull(pageNum) ? 1 : pageNum;

            Integer pageSize = pageReq.getPageSize();
            pageSize = Objects.isNull(pageSize) ? 20 : pageSize;

            boolean isCount = Objects.nonNull(pageReq.getIsCount()) ? pageReq.getIsCount() : true;

            // 使用分页插件
            Page<R> pageRes = PageMethod.startPage(pageNum, pageSize, isCount);
            // 执行查询方法
            List<R> list = queryMethod.apply(pageReq);
            // 封装分页
            PageVO<R> pageResponse = new PageVO<>();
            pageResponse.setPageSize(pageRes.getPageSize());
            pageResponse.setTotalRows(pageRes.getTotal());
            pageResponse.setPageNum(pageRes.getPageNum());
            pageResponse.setTotalPages(pageRes.getPages());
            pageResponse.setRoot(list);
            return pageResponse;
        } catch (Exception e) {
            log.error("page query fail", e);
            throw new RuntimeException(e);
        }
    }
}

